This R notebook is to showcase examples of analyses that can be done based on Twitter-data and Twitter-meta-data.

Let’s focus on a more relevant topic, say the currently ongoing NBA Playoffs, since Twitter only makes recent tweets available. Additionally, not all teams are equal, in the sense that more popular teams will have more relevant Twitter activity and less popular teams will have less. So, let’s compare the Twitter activity of the two teams in last year’s NBA Playoff Finals - Cleveland Cavaliers & Golden State Warriors.

Note: While Twitter allows a maximum of 3600 tweets to be grabbed at once, this is a slow process. Thus, we choose to grab n=3000 tweets whenever searchTwitter() from the twitteR package is called. Further, Twitter has restricted acces to its API, meaning too many requests to access Twitter’s API in a short period of time leads to an error. There is no way to get around that, so we must be careful how many calls to access Twitter’s API in a certain period of time we make. Otherwise, we have to wait, before trying again.

Charting When Tweets Were Created:

We may want to chronicle tweets from a given user’s Timeline. Below, we chronicle the recent 3000 tweets on the official Cleveland Cavaliers Twitter and the recent 3000 tweets on the official Golden State Warriors Twitter. Also, we marked the dates corresponding to each team’s playoff games. For the Warriors, as far as the last 4 games go, Twitter activity by official @warriors seems to be concentrated in the time immediately following a game. For the Cavs, as far as the last 4 games go, Twitter activity by official @cavs seems to more averagely spread across the time before, during, and after a game. Those tweets in between games, for both official team accounts, can probably be accounted for by promotional tweets, e.g. tweets promoting the sale of tickets. Seeing as how this is only the beginning of the Playoffs, i.e., Round 1, of course there is a high volume of tweets in the last few days reflecting the momentum of social media activity as hype for the successive games rises. As for the spread of tweets referencing either team by non-team-official accounts, it is expected that they would concentrate in the last few days, given the restriction of the number of tweets we’re able to access. So, there is no significant conclusion that can be drawn from chronicling all Twitter user tweets about the Golden State Warriors and Cleveland Cavaliers.

Breakdown of Tweets by the Hour:

We can look more in detail at tweets from the official @warriors and @cavs accounts based on hour of day. Again, from the 3000 tweets grabbed from Twitter, we plot the percentage of tweets as a function of the hour of the day (in Eastern Standard Time). Notice that the official @cavs has its highest percentage of tweets posted between 1pm and 2pm. This seems to be related to the fact that 2 of the 4 Cavs games have been at 1pm and 3pm. Additionally, the second peak about 8pm is related to the other 2 games at 7pm. The higher peak between 1pm and 2pm can be attributed to the fact that those 2 early afternoon games were on the weekend. Thus, it makes sense that more people are free to watch weekend, rather than weekday, games. So, official at @cavs may tweet more on the weekends to reach a larger audience. The same logic applies to the trend we see in the graph of percentage of tweets by hour for the Warriors. Since 3 of the 4 Warriors games were at 10:30pm, the greatest peak around midnight makes sense. The second peak is attributed to the 4th game that went on at 3pm. Officials for both the Cavs and Warriors are probably tweeting game highlights and recaps.

Now here is the breakdown of tweets from non-team-official Twitter users. The Cavs won all four of their Round 1 games against the Pacers. But their first game on April 15 at 3pm was the closest, as Cavs beat Pacers by 1 point (109-108). So the hype of the first game and the close score would explain the highest peak of Twitter activity, except that tweets were from April 24th-26th. Without further information about Cavs fans (or at least those who tweet about the Cavs), we can’t conclude anything about twitter users tweeting about the Cavs. Further, for those tweeting about the Warriors, we may speculate that the time difference between East Coast and West Coast contribute to the highest peak at noon EST. Since most fans of the Warriors are probably on Pacific Standard Time, for the context of when they’re tweeting in the day, we should consider tweets in PST. So then, at around 9am PST, tweets about the Warriors are at the highest level. Perhaps, many fans don’t watch the games in real-time, and watch recaps the next morning. That would certainly account for the morning tweets about the Warriors. Again, we have no way of knowing for certain without additional information about Twitter users’ tweeting behavior.

Wordcloud:

The following is a word cloud based on tweets about the Cavaliers:

The following is a word cloud based on tweets about the Warriors:

Frequently Used Words Among a Set of Tweets:

Here, we analyze frequency of words used in tweets by official team accounts - @cavs and @warriors - by looking at a bar graph. The most frequently used term in official @cavs tweets is ‘#defendtheland’. This hashtag is obviously one that the team is trying to associate itself with and make trendy so that other Twitter users may use the hashtag in reference to the Cavs. The second most frequently used term is ‘#cavspacers’, which is no surprise as the Round 1 games have Cavs against Pacers. Other words that appear in this chart are also very much in line with promotional tweets that @cavs posts. As for the officials at @warriors, notably, the most frequently used term is ‘#dubnation’, with which the team is trying to associate. This particular hashtag has broader precedent in the context of California, so its usage by @warriors is strategic to reach more fans. Another notable term is perhaps ‘win’, which did not appear in the most frequently used words by @cavs. This suggests that tweets from @warriors are more positive than thos from @cavs. Similar to tweets from @cavs, many of the frequently used words that appear in the chart serve to inform audiences and promote viewership of games.

Sentiment Analysis: (NRC Lexicon; 10 sentiments)

First, let’s look at the sentiment analysis of tweets about the Cleveland Cavaliers. Users tweeting about the Cavs use first and foremost positive words though negative words are a close third. Clearly, we can deduce that positive sentiments are from Cavs fans. However, negative sentiment may come from fans of rival teams (perhaps specifically fans of currently opposing team, the Pacers) and disappointed fans. The second most common sentiment in tweets about the Cavs is anticipation, which is not surprising as playoff games bring about a build-up of energy and emotions. The two weakest sentiments are anger and surprise which makes sense, since the Cavs won all 4 of their Round 1 games against the Pacers. Fans don’t really have anything to be angry about and fans ought not be surprised since they by virtue of being fans expect their team to win.

Here are the ten most common positive words in the 3000 tweets about the Cavaliers:

Here are the ten most common negative words in the 3000 tweets about the Cavaliers:

Now, let’s look at the sentiment analysis of tweets about the Golden State Warriors. By an overwhelming amount, the positive sentiment is strongest across all the tweets about the Warriors (even stronger than positive sentiment among tweets about the Cavs, at least in terms of number of positive words). Though unlike with the tweets about the Cavs that had the sentiment negative as the thrid strongest sentiment, tweets about the Warriors have the sentiment joy as the third strongest sentiment. This further affirms that the dialogue surrounding the Warriors is generally more positive and happy than that regarding the Cavs. Similar to tweets about the Cavs, tweets about the Warriors have anticipation as the second strongest sentiment. Further notable is that trust is tied for the third strongest sentiment (along with joy) here. So, it seems those who tweet about the Warriors, presumably fans, are more confident and pleased, than those who tweet about the Cavs.

Here are the ten most common positive words in the 3000 tweets about the Warriors:

Here are the ten most common negative words in the 3000 tweets about the Warriors:

Extension:

Analyzing Twitter data and meta-data allows us some insight into what people talk about and how they talk about them. Although we focused on the behavior and emotions of Cavaliers and Warriors fan, similar analyses can extend to other segments of Twitter users. We created a short interactive html notebook that takes a user-supplied term and searches Twitter’s API for the user-specified number of tweets mentioning the term. The output is a data table of the latest 5 relevant tweets and a wordcloud based on the tweets. Additionally, the user can download a .csv file with data from status objects returned by searchTwitter(). Below are screenshots of a few examples:

1) Term = “NBA”; nTweets = 5

2) Term = “life”; nTweets = 5

3) Term = “life”; nTweets = 123

LS0tCnRpdGxlOiAiRXhwbG9yYXRvcnkgQW5hbHlzaXMgd2l0aCBEYXRhIE1pbmVkIGZyb20gVHdpdHRlciIKZmlnX3dpZHRoOiA2Cm91dHB1dDoKICBodG1sX25vdGVib29rOiBkZWZhdWx0CiAgaHRtbF9kb2N1bWVudDogZGVmYXVsdApmaWdfaGVpZ2h0OiA0Ci0tLQogIApUaGlzIFIgbm90ZWJvb2sgaXMgdG8gc2hvd2Nhc2UgZXhhbXBsZXMgb2YgYW5hbHlzZXMgdGhhdCBjYW4gYmUgZG9uZSBiYXNlZCBvbiBUd2l0dGVyLWRhdGEgYW5kIFR3aXR0ZXItbWV0YS1kYXRhLiAgCiAgCkxldCdzIGZvY3VzIG9uIGEgbW9yZSByZWxldmFudCB0b3BpYywgc2F5IHRoZSBjdXJyZW50bHkgb25nb2luZyBOQkEgUGxheW9mZnMsIHNpbmNlIFR3aXR0ZXIgb25seSBtYWtlcyByZWNlbnQgdHdlZXRzIGF2YWlsYWJsZS4gQWRkaXRpb25hbGx5LCBub3QgYWxsIHRlYW1zIGFyZSBlcXVhbCwgaW4gdGhlIHNlbnNlIHRoYXQgbW9yZSBwb3B1bGFyIHRlYW1zIHdpbGwgaGF2ZSBtb3JlIHJlbGV2YW50IFR3aXR0ZXIgYWN0aXZpdHkgYW5kIGxlc3MgcG9wdWxhciB0ZWFtcyB3aWxsIGhhdmUgbGVzcy4gU28sIGxldCdzIGNvbXBhcmUgdGhlIFR3aXR0ZXIgYWN0aXZpdHkgb2YgdGhlIHR3byB0ZWFtcyBpbiBsYXN0IHllYXIncyBOQkEgUGxheW9mZiBGaW5hbHMgLSBDbGV2ZWxhbmQgQ2F2YWxpZXJzICYgR29sZGVuIFN0YXRlIFdhcnJpb3JzLiAgCiAgCioqTm90ZToqKiBXaGlsZSBUd2l0dGVyIGFsbG93cyBhIG1heGltdW0gb2YgMzYwMCB0d2VldHMgdG8gYmUgZ3JhYmJlZCBhdCBvbmNlLCB0aGlzIGlzIGEgc2xvdyBwcm9jZXNzLiBUaHVzLCB3ZSBjaG9vc2UgdG8gZ3JhYiBuPTMwMDAgdHdlZXRzIHdoZW5ldmVyIGBgYHNlYXJjaFR3aXR0ZXIoKWBgYCBmcm9tIHRoZSBgYGB0d2l0dGVSYGBgIHBhY2thZ2UgaXMgY2FsbGVkLiBGdXJ0aGVyLCBUd2l0dGVyIGhhcyByZXN0cmljdGVkIGFjY2VzIHRvIGl0cyBBUEksIG1lYW5pbmcgdG9vIG1hbnkgcmVxdWVzdHMgdG8gYWNjZXNzIFR3aXR0ZXIncyBBUEkgaW4gYSBzaG9ydCBwZXJpb2Qgb2YgdGltZSBsZWFkcyB0byBhbiBlcnJvci4gVGhlcmUgaXMgbm8gd2F5IHRvIGdldCBhcm91bmQgdGhhdCwgc28gd2UgbXVzdCBiZSBjYXJlZnVsIGhvdyBtYW55IGNhbGxzIHRvIGFjY2VzcyBUd2l0dGVyJ3MgQVBJIGluIGEgY2VydGFpbiBwZXJpb2Qgb2YgdGltZSB3ZSBtYWtlLiBPdGhlcndpc2UsIHdlIGhhdmUgdG8gd2FpdCwgYmVmb3JlIHRyeWluZyBhZ2Fpbi4gIAogIAojIyMgQ2hhcnRpbmcgV2hlbiBUd2VldHMgV2VyZSBDcmVhdGVkOiAgCldlIG1heSB3YW50IHRvIGNocm9uaWNsZSB0d2VldHMgZnJvbSBhIGdpdmVuIHVzZXIncyBUaW1lbGluZS4gQmVsb3csIHdlIGNocm9uaWNsZSB0aGUgcmVjZW50IDMwMDAgdHdlZXRzIG9uIHRoZSBvZmZpY2lhbCBDbGV2ZWxhbmQgQ2F2YWxpZXJzIFR3aXR0ZXIgYW5kIHRoZSByZWNlbnQgMzAwMCB0d2VldHMgb24gdGhlIG9mZmljaWFsIEdvbGRlbiBTdGF0ZSBXYXJyaW9ycyBUd2l0dGVyLiBBbHNvLCB3ZSBtYXJrZWQgdGhlIGRhdGVzIGNvcnJlc3BvbmRpbmcgdG8gZWFjaCB0ZWFtJ3MgcGxheW9mZiBnYW1lcy4gRm9yIHRoZSBXYXJyaW9ycywgYXMgZmFyIGFzIHRoZSBsYXN0IDQgZ2FtZXMgZ28sIFR3aXR0ZXIgYWN0aXZpdHkgYnkgb2ZmaWNpYWwgXEB3YXJyaW9ycyBzZWVtcyB0byBiZSBjb25jZW50cmF0ZWQgaW4gdGhlIHRpbWUgaW1tZWRpYXRlbHkgZm9sbG93aW5nIGEgZ2FtZS4gRm9yIHRoZSBDYXZzLCBhcyBmYXIgYXMgdGhlIGxhc3QgNCBnYW1lcyBnbywgVHdpdHRlciBhY3Rpdml0eSBieSBvZmZpY2lhbCBcQGNhdnMgc2VlbXMgdG8gbW9yZSBhdmVyYWdlbHkgc3ByZWFkIGFjcm9zcyB0aGUgdGltZSBiZWZvcmUsIGR1cmluZywgYW5kIGFmdGVyIGEgZ2FtZS4gVGhvc2UgdHdlZXRzIGluIGJldHdlZW4gZ2FtZXMsIGZvciBib3RoIG9mZmljaWFsIHRlYW0gYWNjb3VudHMsIGNhbiBwcm9iYWJseSBiZSBhY2NvdW50ZWQgZm9yIGJ5IHByb21vdGlvbmFsIHR3ZWV0cywgZS5nLiB0d2VldHMgcHJvbW90aW5nIHRoZSBzYWxlIG9mIHRpY2tldHMuIFNlZWluZyBhcyBob3cgdGhpcyBpcyBvbmx5IHRoZSBiZWdpbm5pbmcgb2YgdGhlIFBsYXlvZmZzLCBpLmUuLCBSb3VuZCAxLCBvZiBjb3Vyc2UgdGhlcmUgaXMgYSBoaWdoIHZvbHVtZSBvZiB0d2VldHMgaW4gdGhlIGxhc3QgZmV3IGRheXMgcmVmbGVjdGluZyB0aGUgbW9tZW50dW0gb2Ygc29jaWFsIG1lZGlhIGFjdGl2aXR5IGFzIGh5cGUgZm9yIHRoZSBzdWNjZXNzaXZlIGdhbWVzIHJpc2VzLiBBcyBmb3IgdGhlIHNwcmVhZCBvZiB0d2VldHMgcmVmZXJlbmNpbmcgZWl0aGVyIHRlYW0gYnkgbm9uLXRlYW0tb2ZmaWNpYWwgYWNjb3VudHMsIGl0IGlzIGV4cGVjdGVkIHRoYXQgdGhleSB3b3VsZCBjb25jZW50cmF0ZSBpbiB0aGUgbGFzdCBmZXcgZGF5cywgZ2l2ZW4gdGhlIHJlc3RyaWN0aW9uIG9mIHRoZSBudW1iZXIgb2YgdHdlZXRzIHdlJ3JlIGFibGUgdG8gYWNjZXNzLiBTbywgdGhlcmUgaXMgbm8gc2lnbmlmaWNhbnQgY29uY2x1c2lvbiB0aGF0IGNhbiBiZSBkcmF3biBmcm9tIGNocm9uaWNsaW5nIGFsbCBUd2l0dGVyIHVzZXIgdHdlZXRzIGFib3V0IHRoZSBHb2xkZW4gU3RhdGUgV2FycmlvcnMgYW5kIENsZXZlbGFuZCBDYXZhbGllcnMuICAKYGBge3IsZWNobz1GLGluY2x1ZGU9VH0KbG9hZCgiLi4vb3V0cHV0L3dhcl9jYXZzX2NyZWF0ZWQuUmRhdGEiKQp3YXJfY2F2c19jcmVhdGVkCmBgYAogIAojIyMgQnJlYWtkb3duIG9mIFR3ZWV0cyBieSB0aGUgSG91cjogIApXZSBjYW4gbG9vayBtb3JlIGluIGRldGFpbCBhdCB0d2VldHMgZnJvbSB0aGUgb2ZmaWNpYWwgXEB3YXJyaW9ycyBhbmQgXEBjYXZzIGFjY291bnRzIGJhc2VkIG9uIGhvdXIgb2YgZGF5LiBBZ2FpbiwgZnJvbSB0aGUgMzAwMCB0d2VldHMgZ3JhYmJlZCBmcm9tIFR3aXR0ZXIsIHdlIHBsb3QgdGhlIHBlcmNlbnRhZ2Ugb2YgdHdlZXRzIGFzIGEgZnVuY3Rpb24gb2YgdGhlIGhvdXIgb2YgdGhlIGRheSAoaW4gRWFzdGVybiBTdGFuZGFyZCBUaW1lKS4gTm90aWNlIHRoYXQgdGhlIG9mZmljaWFsIFxAY2F2cyBoYXMgaXRzIGhpZ2hlc3QgcGVyY2VudGFnZSBvZiB0d2VldHMgcG9zdGVkIGJldHdlZW4gMXBtIGFuZCAycG0uIFRoaXMgc2VlbXMgdG8gYmUgcmVsYXRlZCB0byB0aGUgZmFjdCB0aGF0IDIgb2YgdGhlIDQgQ2F2cyBnYW1lcyBoYXZlIGJlZW4gYXQgMXBtIGFuZCAzcG0uIEFkZGl0aW9uYWxseSwgdGhlIHNlY29uZCBwZWFrIGFib3V0IDhwbSBpcyByZWxhdGVkIHRvIHRoZSBvdGhlciAyIGdhbWVzIGF0IDdwbS4gVGhlIGhpZ2hlciBwZWFrIGJldHdlZW4gMXBtIGFuZCAycG0gY2FuIGJlIGF0dHJpYnV0ZWQgdG8gdGhlIGZhY3QgdGhhdCB0aG9zZSAyIGVhcmx5IGFmdGVybm9vbiBnYW1lcyB3ZXJlIG9uIHRoZSB3ZWVrZW5kLiBUaHVzLCBpdCBtYWtlcyBzZW5zZSB0aGF0IG1vcmUgcGVvcGxlIGFyZSBmcmVlIHRvIHdhdGNoIHdlZWtlbmQsIHJhdGhlciB0aGFuIHdlZWtkYXksIGdhbWVzLiBTbywgb2ZmaWNpYWwgYXQgXEBjYXZzIG1heSB0d2VldCBtb3JlIG9uIHRoZSB3ZWVrZW5kcyB0byByZWFjaCBhIGxhcmdlciBhdWRpZW5jZS4gVGhlIHNhbWUgbG9naWMgYXBwbGllcyB0byB0aGUgdHJlbmQgd2Ugc2VlIGluIHRoZSBncmFwaCBvZiBwZXJjZW50YWdlIG9mIHR3ZWV0cyBieSBob3VyIGZvciB0aGUgV2FycmlvcnMuIFNpbmNlIDMgb2YgdGhlIDQgV2FycmlvcnMgZ2FtZXMgd2VyZSBhdCAxMDozMHBtLCB0aGUgZ3JlYXRlc3QgcGVhayBhcm91bmQgbWlkbmlnaHQgbWFrZXMgc2Vuc2UuIFRoZSBzZWNvbmQgcGVhayBpcyBhdHRyaWJ1dGVkIHRvIHRoZSA0dGggZ2FtZSB0aGF0IHdlbnQgb24gYXQgM3BtLiBPZmZpY2lhbHMgZm9yIGJvdGggdGhlIENhdnMgYW5kIFdhcnJpb3JzIGFyZSBwcm9iYWJseSB0d2VldGluZyBnYW1lIGhpZ2hsaWdodHMgYW5kIHJlY2Fwcy4gCmBgYHtyLGVjaG89RixpbmNsdWRlPVR9CmxvYWQoIi4uL291dHB1dC9jYXZzT19ieUhSLlJkYXRhIikKbG9hZCgiLi4vb3V0cHV0L3dhcnJpb3JzT19ieUhSLlJkYXRhIikKY2F2c09fYnlIciA7IHdhcnJpb3JzT19ieUhyCmBgYAogIApOb3cgaGVyZSBpcyB0aGUgYnJlYWtkb3duIG9mIHR3ZWV0cyBmcm9tIG5vbi10ZWFtLW9mZmljaWFsIFR3aXR0ZXIgdXNlcnMuIFRoZSBDYXZzIHdvbiBhbGwgZm91ciBvZiB0aGVpciBSb3VuZCAxIGdhbWVzIGFnYWluc3QgdGhlIFBhY2Vycy4gQnV0IHRoZWlyIGZpcnN0IGdhbWUgb24gQXByaWwgMTUgYXQgM3BtIHdhcyB0aGUgY2xvc2VzdCwgYXMgQ2F2cyBiZWF0IFBhY2VycyBieSAxIHBvaW50ICgxMDktMTA4KS4gU28gdGhlIGh5cGUgb2YgdGhlIGZpcnN0IGdhbWUgYW5kIHRoZSBjbG9zZSBzY29yZSB3b3VsZCBleHBsYWluIHRoZSBoaWdoZXN0IHBlYWsgb2YgVHdpdHRlciBhY3Rpdml0eSwgZXhjZXB0IHRoYXQgdHdlZXRzIHdlcmUgZnJvbSBBcHJpbCAyNHRoLTI2dGguIFdpdGhvdXQgZnVydGhlciBpbmZvcm1hdGlvbiBhYm91dCBDYXZzIGZhbnMgKG9yIGF0IGxlYXN0IHRob3NlIHdobyB0d2VldCBhYm91dCB0aGUgQ2F2cyksIHdlIGNhbid0IGNvbmNsdWRlIGFueXRoaW5nIGFib3V0IHR3aXR0ZXIgdXNlcnMgdHdlZXRpbmcgYWJvdXQgdGhlIENhdnMuIEZ1cnRoZXIsIGZvciB0aG9zZSB0d2VldGluZyBhYm91dCB0aGUgV2FycmlvcnMsIHdlIG1heSBzcGVjdWxhdGUgdGhhdCB0aGUgdGltZSBkaWZmZXJlbmNlIGJldHdlZW4gRWFzdCBDb2FzdCBhbmQgV2VzdCBDb2FzdCBjb250cmlidXRlIHRvIHRoZSBoaWdoZXN0IHBlYWsgYXQgbm9vbiBFU1QuIFNpbmNlIG1vc3QgZmFucyBvZiB0aGUgV2FycmlvcnMgYXJlIHByb2JhYmx5IG9uIFBhY2lmaWMgU3RhbmRhcmQgVGltZSwgZm9yIHRoZSBjb250ZXh0IG9mIHdoZW4gdGhleSdyZSB0d2VldGluZyBpbiB0aGUgZGF5LCB3ZSBzaG91bGQgY29uc2lkZXIgdHdlZXRzIGluIFBTVC4gU28gdGhlbiwgYXQgYXJvdW5kIDlhbSBQU1QsIHR3ZWV0cyBhYm91dCB0aGUgV2FycmlvcnMgYXJlIGF0IHRoZSBoaWdoZXN0IGxldmVsLiBQZXJoYXBzLCBtYW55IGZhbnMgZG9uJ3Qgd2F0Y2ggdGhlIGdhbWVzIGluIHJlYWwtdGltZSwgYW5kIHdhdGNoIHJlY2FwcyB0aGUgbmV4dCBtb3JuaW5nLiBUaGF0IHdvdWxkIGNlcnRhaW5seSBhY2NvdW50IGZvciB0aGUgbW9ybmluZyB0d2VldHMgYWJvdXQgdGhlIFdhcnJpb3JzLiBBZ2Fpbiwgd2UgaGF2ZSBubyB3YXkgb2Yga25vd2luZyBmb3IgY2VydGFpbiB3aXRob3V0IGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgVHdpdHRlciB1c2VycycgdHdlZXRpbmcgYmVoYXZpb3IuICAKYGBge3IsZWNobz1GLGluY2x1ZGU9VH0KbG9hZCgiLi4vb3V0cHV0L2NhdnNBbGxfYnlIUi5SZGF0YSIpCmxvYWQoIi4uL291dHB1dC93YXJyaW9yc0FsbF9ieUhSLlJkYXRhIikKY2F2c0FsbF9ieUhyOyB3YXJyaW9yc0FsbF9ieUhyCmBgYAogIAojIyMgV29yZGNsb3VkOiAKVGhlIGZvbGxvd2luZyBpcyBhIHdvcmQgY2xvdWQgYmFzZWQgb24gdHdlZXRzIGFib3V0IHRoZSBDYXZhbGllcnM6ICAKYGBge3IsIGVjaG89RixpbmNsdWRlPVR9CmxpYnJhcnkoRUJJbWFnZSkgCkNhdnNDbG91ZCA9IHJlYWRJbWFnZSgnLi4vZmlncy9DYXZzQ2xvdWQucG5nJykgCmRpc3BsYXkoQ2F2c0Nsb3VkLG1ldGhvZD0icmFzdGVyIikgCmBgYAogIApUaGUgZm9sbG93aW5nIGlzIGEgd29yZCBjbG91ZCBiYXNlZCBvbiB0d2VldHMgYWJvdXQgdGhlIFdhcnJpb3JzOiAgCmBgYHtyLGVjaG89RixpbmNsdWRlPVR9CldhcnJpb3JzQ2xvdWQgPSByZWFkSW1hZ2UoJy4uL2ZpZ3MvV2FycmlvcnNDbG91ZC5wbmcnKSAKZGlzcGxheShXYXJyaW9yc0Nsb3VkLG1ldGhvZD0icmFzdGVyIikgCmBgYAoKIyMjIEZyZXF1ZW50bHkgVXNlZCBXb3JkcyBBbW9uZyBhIFNldCBvZiBUd2VldHM6ICAKSGVyZSwgd2UgYW5hbHl6ZSBmcmVxdWVuY3kgb2Ygd29yZHMgdXNlZCBpbiB0d2VldHMgYnkgb2ZmaWNpYWwgdGVhbSBhY2NvdW50cyAtIFxAY2F2cyBhbmQgXEB3YXJyaW9ycyAtIGJ5IGxvb2tpbmcgYXQgYSBiYXIgZ3JhcGguIFRoZSBtb3N0IGZyZXF1ZW50bHkgdXNlZCB0ZXJtIGluIG9mZmljaWFsIFxAY2F2cyB0d2VldHMgaXMgJ1wjZGVmZW5kdGhlbGFuZCcuIFRoaXMgaGFzaHRhZyBpcyBvYnZpb3VzbHkgb25lIHRoYXQgdGhlIHRlYW0gaXMgdHJ5aW5nIHRvIGFzc29jaWF0ZSBpdHNlbGYgd2l0aCBhbmQgbWFrZSB0cmVuZHkgc28gdGhhdCBvdGhlciBUd2l0dGVyIHVzZXJzIG1heSB1c2UgdGhlIGhhc2h0YWcgaW4gcmVmZXJlbmNlIHRvIHRoZSBDYXZzLiBUaGUgc2Vjb25kIG1vc3QgZnJlcXVlbnRseSB1c2VkIHRlcm0gaXMgJ1wjY2F2c3BhY2VycycsIHdoaWNoIGlzIG5vIHN1cnByaXNlIGFzIHRoZSBSb3VuZCAxIGdhbWVzIGhhdmUgQ2F2cyBhZ2FpbnN0IFBhY2Vycy4gT3RoZXIgd29yZHMgdGhhdCBhcHBlYXIgaW4gdGhpcyBjaGFydCBhcmUgYWxzbyB2ZXJ5IG11Y2ggaW4gbGluZSB3aXRoIHByb21vdGlvbmFsIHR3ZWV0cyB0aGF0IFxAY2F2cyBwb3N0cy4gQXMgZm9yIHRoZSBvZmZpY2lhbHMgYXQgXEB3YXJyaW9ycywgbm90YWJseSwgdGhlIG1vc3QgZnJlcXVlbnRseSB1c2VkIHRlcm0gaXMgJ1wjZHVibmF0aW9uJywgd2l0aCB3aGljaCB0aGUgdGVhbSBpcyB0cnlpbmcgdG8gYXNzb2NpYXRlLiBUaGlzIHBhcnRpY3VsYXIgaGFzaHRhZyBoYXMgYnJvYWRlciBwcmVjZWRlbnQgaW4gdGhlIGNvbnRleHQgb2YgQ2FsaWZvcm5pYSwgc28gaXRzIHVzYWdlIGJ5IFxAd2FycmlvcnMgaXMgc3RyYXRlZ2ljIHRvIHJlYWNoIG1vcmUgZmFucy4gQW5vdGhlciBub3RhYmxlIHRlcm0gaXMgcGVyaGFwcyAnd2luJywgd2hpY2ggZGlkIG5vdCBhcHBlYXIgaW4gdGhlIG1vc3QgZnJlcXVlbnRseSB1c2VkIHdvcmRzIGJ5IFxAY2F2cy4gVGhpcyBzdWdnZXN0cyB0aGF0IHR3ZWV0cyBmcm9tIFxAd2FycmlvcnMgYXJlIG1vcmUgcG9zaXRpdmUgdGhhbiB0aG9zIGZyb20gXEBjYXZzLiBTaW1pbGFyIHRvIHR3ZWV0cyBmcm9tIFxAY2F2cywgbWFueSBvZiB0aGUgZnJlcXVlbnRseSB1c2VkIHdvcmRzIHRoYXQgYXBwZWFyIGluIHRoZSBjaGFydCBzZXJ2ZSB0byBpbmZvcm0gYXVkaWVuY2VzIGFuZCBwcm9tb3RlIHZpZXdlcnNoaXAgb2YgZ2FtZXMuICAKYGBge3IsZWNobz1GLGluY2x1ZGU9VH0KbG9hZCgiLi4vb3V0cHV0L2NhdnNPX3dvcmRfY3RfYmFyLlJkYXRhIikKbG9hZCgiLi4vb3V0cHV0L3dhcnJpb3JzT193b3JkX2N0X2Jhci5SZGF0YSIpCmNhdnNPX3dvcmRfY3RfYmFyIDsgd2FycmlvcnNPX3dvcmRfY3RfYmFyCmBgYAogIAojIyMgU2VudGltZW50IEFuYWx5c2lzOiAgKE5SQyBMZXhpY29uOyAxMCBzZW50aW1lbnRzKSAgCkZpcnN0LCBsZXQncyBsb29rIGF0IHRoZSAqKnNlbnRpbWVudCBhbmFseXNpcyBvZiB0d2VldHMgYWJvdXQgdGhlIENsZXZlbGFuZCBDYXZhbGllcnMqKi4gVXNlcnMgdHdlZXRpbmcgYWJvdXQgdGhlIENhdnMgdXNlIGZpcnN0IGFuZCBmb3JlbW9zdCBwb3NpdGl2ZSB3b3JkcyB0aG91Z2ggbmVnYXRpdmUgd29yZHMgYXJlIGEgY2xvc2UgdGhpcmQuIENsZWFybHksIHdlIGNhbiBkZWR1Y2UgdGhhdCBwb3NpdGl2ZSBzZW50aW1lbnRzIGFyZSBmcm9tIENhdnMgZmFucy4gSG93ZXZlciwgbmVnYXRpdmUgc2VudGltZW50IG1heSBjb21lIGZyb20gZmFucyBvZiByaXZhbCB0ZWFtcyAocGVyaGFwcyBzcGVjaWZpY2FsbHkgZmFucyBvZiBjdXJyZW50bHkgb3Bwb3NpbmcgdGVhbSwgdGhlIFBhY2VycykgYW5kIGRpc2FwcG9pbnRlZCBmYW5zLiBUaGUgc2Vjb25kIG1vc3QgY29tbW9uIHNlbnRpbWVudCBpbiB0d2VldHMgYWJvdXQgdGhlIENhdnMgaXMgYW50aWNpcGF0aW9uLCB3aGljaCBpcyBub3Qgc3VycHJpc2luZyBhcyBwbGF5b2ZmIGdhbWVzIGJyaW5nIGFib3V0IGEgYnVpbGQtdXAgb2YgZW5lcmd5IGFuZCBlbW90aW9ucy4gVGhlIHR3byB3ZWFrZXN0IHNlbnRpbWVudHMgYXJlIGFuZ2VyIGFuZCBzdXJwcmlzZSB3aGljaCBtYWtlcyBzZW5zZSwgc2luY2UgdGhlIENhdnMgd29uIGFsbCA0IG9mIHRoZWlyIFJvdW5kIDEgZ2FtZXMgYWdhaW5zdCB0aGUgUGFjZXJzLiBGYW5zIGRvbid0IHJlYWxseSBoYXZlIGFueXRoaW5nIHRvIGJlIGFuZ3J5IGFib3V0IGFuZCBmYW5zIG91Z2h0IG5vdCBiZSBzdXJwcmlzZWQgc2luY2UgdGhleSBieSB2aXJ0dWUgb2YgIGJlaW5nIGZhbnMgZXhwZWN0IHRoZWlyIHRlYW0gdG8gd2luLiAgCmBgYHtyLGVjaG89RixpbmNsdWRlPVR9CiNzZW50aW1lbnQgYW5hbHlzaXMgb2YgdHdlZXRzIGFib3V0IHRoZSBDYXZzCmxvYWQoIi4uL291dHB1dC9jYXZzQWxsX3NlbnRpLlJkYXRhIikKY2F2c0FsbF9zZW50aQpgYGAKICAKSGVyZSBhcmUgdGhlIHRlbiBtb3N0IGNvbW1vbiBwb3NpdGl2ZSB3b3JkcyBpbiB0aGUgMzAwMCB0d2VldHMgYWJvdXQgdGhlIENhdmFsaWVyczogIApgYGB7cixlY2hvPUYsaW5jbHVkZT1UfQojIDEwIG1vc3QgY29tbW9uIHBvc2l0aXZlIHdvcmRzIGluIHR3ZWV0cyBhYm91dCB0aGUgQ2F2cwpsb2FkKCIuLi9vdXRwdXQvY2F2c0FsbF9wb3MuUmRhdGEiKQpoZWFkKGNhdnNBbGxfcG9zLDEwKQpgYGAKICAKSGVyZSBhcmUgdGhlIHRlbiBtb3N0IGNvbW1vbiBuZWdhdGl2ZSB3b3JkcyBpbiB0aGUgMzAwMCB0d2VldHMgYWJvdXQgdGhlIENhdmFsaWVyczogIApgYGB7cixlY2hvPUYsaW5jbHVkZT1UfQojIDEwIG1vc3QgY29tbW9uIG5lZ2F0aXZlIHdvcmRzIGluIHR3ZWV0cyBhYm91dCB0aGUgQ2F2cwpsb2FkKCIuLi9vdXRwdXQvY2F2c0FsbF9uZWcuUmRhdGEiKQpoZWFkKGNhdnNBbGxfbmVnLDEwKQpgYGAKICAKICAKTm93LCBsZXQncyBsb29rIGF0IHRoZSAqKnNlbnRpbWVudCBhbmFseXNpcyBvZiB0d2VldHMgYWJvdXQgdGhlIEdvbGRlbiBTdGF0ZSBXYXJyaW9ycyoqLiBCeSBhbiBvdmVyd2hlbG1pbmcgYW1vdW50LCB0aGUgcG9zaXRpdmUgc2VudGltZW50IGlzIHN0cm9uZ2VzdCBhY3Jvc3MgYWxsIHRoZSB0d2VldHMgYWJvdXQgdGhlIFdhcnJpb3JzIChldmVuIHN0cm9uZ2VyIHRoYW4gcG9zaXRpdmUgc2VudGltZW50IGFtb25nIHR3ZWV0cyBhYm91dCB0aGUgQ2F2cywgYXQgbGVhc3QgaW4gdGVybXMgb2YgbnVtYmVyIG9mIHBvc2l0aXZlIHdvcmRzKS4gVGhvdWdoIHVubGlrZSB3aXRoIHRoZSB0d2VldHMgYWJvdXQgdGhlIENhdnMgdGhhdCBoYWQgdGhlIHNlbnRpbWVudCBuZWdhdGl2ZSBhcyB0aGUgdGhyaWQgc3Ryb25nZXN0IHNlbnRpbWVudCwgdHdlZXRzIGFib3V0IHRoZSBXYXJyaW9ycyBoYXZlIHRoZSBzZW50aW1lbnQgam95IGFzIHRoZSB0aGlyZCBzdHJvbmdlc3Qgc2VudGltZW50LiBUaGlzIGZ1cnRoZXIgYWZmaXJtcyB0aGF0IHRoZSBkaWFsb2d1ZSBzdXJyb3VuZGluZyB0aGUgV2FycmlvcnMgaXMgZ2VuZXJhbGx5IG1vcmUgcG9zaXRpdmUgYW5kIGhhcHB5IHRoYW4gdGhhdCByZWdhcmRpbmcgdGhlIENhdnMuIFNpbWlsYXIgdG8gdHdlZXRzIGFib3V0IHRoZSBDYXZzLCB0d2VldHMgYWJvdXQgdGhlIFdhcnJpb3JzIGhhdmUgYW50aWNpcGF0aW9uIGFzIHRoZSBzZWNvbmQgc3Ryb25nZXN0IHNlbnRpbWVudC4gRnVydGhlciBub3RhYmxlIGlzIHRoYXQgdHJ1c3QgaXMgdGllZCBmb3IgdGhlIHRoaXJkIHN0cm9uZ2VzdCBzZW50aW1lbnQgKGFsb25nIHdpdGggam95KSBoZXJlLiBTbywgaXQgc2VlbXMgdGhvc2Ugd2hvIHR3ZWV0IGFib3V0IHRoZSBXYXJyaW9ycywgcHJlc3VtYWJseSBmYW5zLCBhcmUgbW9yZSBjb25maWRlbnQgYW5kIHBsZWFzZWQsIHRoYW4gdGhvc2Ugd2hvIHR3ZWV0IGFib3V0IHRoZSBDYXZzLiAgCmBgYHtyLGVjaG89RixpbmNsdWRlPVR9CiNzZW50aW1lbnQgYW5hbHlzaXMgb2YgdHdlZXRzIGFib3V0IHRoZSBXYXJyaW9ycwpsb2FkKCIuLi9vdXRwdXQvd2FycmlvcnNBbGxfc2VudGkuUmRhdGEiKQp3YXJyaW9yc0FsbF9zZW50aQpgYGAKICAKSGVyZSBhcmUgdGhlIHRlbiBtb3N0IGNvbW1vbiBwb3NpdGl2ZSB3b3JkcyBpbiB0aGUgMzAwMCB0d2VldHMgYWJvdXQgdGhlIFdhcnJpb3JzOiAgCmBgYHtyLGVjaG89RixpbmNsdWRlPVR9CiMgMTAgbW9zdCBjb21tb24gcG9zaXRpdmUgd29yZHMgaW4gdHdlZXRzIGFib3V0IHRoZSBXYXJyaW9ycwpsb2FkKCIuLi9vdXRwdXQvd2FycmlvcnNBbGxfcG9zLlJkYXRhIikKaGVhZCh3YXJyaW9yc0FsbF9wb3MsMTApCmBgYAogIApIZXJlIGFyZSB0aGUgdGVuIG1vc3QgY29tbW9uIG5lZ2F0aXZlIHdvcmRzIGluIHRoZSAzMDAwIHR3ZWV0cyBhYm91dCB0aGUgV2FycmlvcnM6ICAKYGBge3IsZWNobz1GLGluY2x1ZGU9VH0KIyAxMCBtb3N0IGNvbW1vbiBuZWdhdGl2ZSB3b3JkcyBpbiB0d2VldHMgYWJvdXQgdGhlIFdhcnJpb3JzCmxvYWQoIi4uL291dHB1dC93YXJyaW9yc0FsbF9uZWcuUmRhdGEiKQpoZWFkKHdhcnJpb3JzQWxsX25lZywxMCkKYGBgCgogIAojIyMgRXh0ZW5zaW9uOiAgCkFuYWx5emluZyBUd2l0dGVyIGRhdGEgYW5kIG1ldGEtZGF0YSBhbGxvd3MgdXMgc29tZSBpbnNpZ2h0IGludG8gd2hhdCBwZW9wbGUgdGFsayBhYm91dCBhbmQgaG93IHRoZXkgdGFsayBhYm91dCB0aGVtLiBBbHRob3VnaCB3ZSBmb2N1c2VkIG9uIHRoZSBiZWhhdmlvciBhbmQgZW1vdGlvbnMgb2YgQ2F2YWxpZXJzIGFuZCBXYXJyaW9ycyBmYW4sIHNpbWlsYXIgYW5hbHlzZXMgY2FuIGV4dGVuZCB0byBvdGhlciBzZWdtZW50cyBvZiBUd2l0dGVyIHVzZXJzLiBXZSBjcmVhdGVkIGEgc2hvcnQgaW50ZXJhY3RpdmUgaHRtbCBub3RlYm9vayB0aGF0IHRha2VzIGEgdXNlci1zdXBwbGllZCB0ZXJtIGFuZCBzZWFyY2hlcyBUd2l0dGVyJ3MgQVBJIGZvciB0aGUgdXNlci1zcGVjaWZpZWQgbnVtYmVyIG9mIHR3ZWV0cyBtZW50aW9uaW5nIHRoZSB0ZXJtLiBUaGUgb3V0cHV0IGlzIGEgZGF0YSB0YWJsZSBvZiB0aGUgbGF0ZXN0IDUgcmVsZXZhbnQgdHdlZXRzIGFuZCBhIHdvcmRjbG91ZCBiYXNlZCBvbiB0aGUgdHdlZXRzLiBBZGRpdGlvbmFsbHksIHRoZSB1c2VyIGNhbiBkb3dubG9hZCBhIGBgYC5jc3ZgYGAgZmlsZSB3aXRoIGRhdGEgZnJvbSBgYGBzdGF0dXNgYGAgb2JqZWN0cyByZXR1cm5lZCBieSBgYGBzZWFyY2hUd2l0dGVyKClgYGAuIEJlbG93IGFyZSBzY3JlZW5zaG90cyBvZiBhIGZldyBleGFtcGxlczogIAogIAoqKjEpIFRlcm0gPSAiTkJBIjsgblR3ZWV0cyA9IDUqKiAgCmBgYHtyLGVjaG89RixpbmNsdWRlPVR9ClNjcmVlblNob3RfMSA9IHJlYWRJbWFnZSgnLi4vZmlncy9TY3JlZW5TaG90XzEucG5nJykgCmRpc3BsYXkoU2NyZWVuU2hvdF8xLG1ldGhvZD0icmFzdGVyIikgCgpTY3JlZW5TaG90XzIgPSByZWFkSW1hZ2UoJy4uL2ZpZ3MvU2NyZWVuU2hvdF8yLnBuZycpIApkaXNwbGF5KFNjcmVlblNob3RfMixtZXRob2Q9InJhc3RlciIpIApgYGAKICAKKioyKSBUZXJtID0gImxpZmUiOyBuVHdlZXRzID0gNSoqICAKYGBge3IsZWNobz1GLGluY2x1ZGU9VH0KU2NyZWVuU2hvdF8zID0gcmVhZEltYWdlKCcuLi9maWdzL1NjcmVlblNob3RfMy5wbmcnKSAKZGlzcGxheShTY3JlZW5TaG90XzMsbWV0aG9kPSJyYXN0ZXIiKSAKClNjcmVlblNob3RfNCA9IHJlYWRJbWFnZSgnLi4vZmlncy9TY3JlZW5TaG90XzQucG5nJykgCmRpc3BsYXkoU2NyZWVuU2hvdF80LG1ldGhvZD0icmFzdGVyIikgCmBgYAogIAoqKjMpIFRlcm0gPSAibGlmZSI7IG5Ud2VldHMgPSAxMjMqKiAgCmBgYHtyLGVjaG89RixpbmNsdWRlPVR9ClNjcmVlblNob3RfNSA9IHJlYWRJbWFnZSgnLi4vZmlncy9TY3JlZW5TaG90XzUucG5nJykgCmRpc3BsYXkoU2NyZWVuU2hvdF81LG1ldGhvZD0icmFzdGVyIikgCgpTY3JlZW5TaG90XzYgPSByZWFkSW1hZ2UoJy4uL2ZpZ3MvU2NyZWVuU2hvdF82LnBuZycpIApkaXNwbGF5KFNjcmVlblNob3RfNixtZXRob2Q9InJhc3RlciIpIApgYGAKICAKICAK